王子子的成长之路

sklearn学习笔记-3 回归模型

回归模型:

线性回归模型

感知器模型

最简单的模型,多层感知器MLP即最简单的深度学习网络。
感知器模型通过循环修正计算误差进行修正,因此没有没有学习率;在学习中,需要指定学习次数(例如学习样本数),否则感知器模型会无休止的进行下去。
基础(单层)感知器模型是非常弱的模型,不会存在过拟合的情况。

sklearn.linera_model.Perceptron(penalty=None, alpha=0.0001, fit_intercept=True, n_iter=5,   shuffle=True, verbose=0, eta0=1.0, n_jobs=1. random_state = 0, class_weight=None,   warm_start=False)  

参数

  • penalty:正则惩罚项,默认为0
  • fit_intercept:截距
  • n_iter:迭代次数
  • shuffle:洗牌
  • verbose:打印日志等级
  • eta0 :学习率
  • n_jobs:启动线程数,-1代表最大

实例

df = pd.read_csv(r'D:\BaiduYunDownload\sklearn\3.0 线性模型\adultTest.csv')  
#将object变量(字符串)制成稀疏矩阵,class是目标变量,不用放入  
dfNew=pd.get_dummies(df,columns=['workclass','education','marital-status','occupation','relationship','race','sex', 'native-country'])  
  
dfNew['target'] = dfNew['class'].apply(lambda x: 1 if x == r' <=50K' else 0)  # 将结果二分为1和0  
xdata = dfNew.drop(['class','target'],axis = 1)  # 测试集  
ydata = dfNew['target']  # 结果集  
  
from sklearn.linear_model import Perceptron  # 调用感应器模型函数  
per = Perceptron(n_iter=20)  # 创建对象并设定迭代次数为20  
per.fit(xdata,ydata)  # 训练模型  
print(per.predict(xdata))  # 对模型进行预测  
print(per.score(xdata,ydata))  # 对模型进行准确率评估  

tips:感知器没有概率值

线性回归模型

sklearn.linear_model.LinearRegression9(fit_intercept = True, normalize = False, copy_X = True, n_jobs = 1)  

fit_intercept:是否计算截距
normalize:是否对整个样本进行数据标准化,线性模型并不依赖于正则,所以此参数无意义。

线性回归模型需要接受一个连续性的变量,以达到预测。

在线性模型中,更复杂的模型会用到alpha惩罚项,简称a,并且会通过数据集的定义方式选择raige函数和lasso函数。

raige和lasso的区别

raige接受l2的正则,lasso接受l1的正则。
raige:(w1)2+(w2)2+(w3)^2…,每个权重平方相加;lasso:|w1|+|w2|+|w3|…,每个权重绝对值相加。
lasso接受的l1范数,所以得到的解可能是稀疏的,导致很多系数的权重都为0;raige接受l2的范数,得到的解不会为0。
从方便的角度考虑,我们更多的使用l2范数的raige。

交叉验证(Cross validation)
交叉验证用于防止模型过于复杂而引起的过拟合。有时亦称循环估计,是一种统计学上将数据样本切割成较小子集的实用方法。于是可以先在一个子集上做分析,而其它子集则用来做后续对此分析的确认及验证。交叉验证是一种评估统计分析、机器学习算法对独立于训练数据的数据集的泛化能力(generalize)。
在sklearn的在线性模型中,为了保证模型值,我们可以使用后续加CV的函数来进行交叉验证:

alpha:接受一个数组,数组内是所有认为有效的a的值,函数会自动选择最优值
cv:接受交叉验证的切分份数
scoring:评估指标,不填写会选择默认指标进行判断,也接受填写最小绝对值误差/最小均方误差,一般不填写
其他同上

在进行CV时,有时可能会遇到被切分的样本内没有1,或者样本不均匀的问题,因此我们调用分层函数进行解决:

from sklearn.cross_validation import StratifiedKFold#调用分层函数  
sf = StratifiedKFold(ydata,n_folds=5)  # 创建对象并选择分为几层,避免发生稀疏矩阵的数据不均匀的问题  

这种情况在分类模型中才会发生,回归模型的y是连续值,因此不必进行分层。